NexusPi Git Node
Commit 20ec0b4ee3f3e7a8b3c8d00dcdcd5afdcf2bc840
Parents : 7e42034
Author : James L <jrl290@gmail.com>
Date : 2026-07-27T18:37:18-04:00
v1.0.47 — LoRa repeater audit: atomic queue, same-interface announce propagation
- Atomic LoRa TX queue: reject whole packet when space insufficient
instead of emitting truncated frames (RNode_Firmware.ino)
- Version bump: Config.h 1.0.46 → 1.0.47, MIN_VERS 0x2F
- Update versions.json manifests for web flasher
The OLED bitmap (Graphics.h bm_version) still shows 1.0.46;
a bitmap regeneration tool is needed to update the 64×27 pixel
version display on the SSD1306.
Changes
4 files changed, 47 insertions(+), 27 deletions(-)
Diff
diff --git a/Config.h b/Config.h
index 2aa75a6..82f37b4 100755
--- a/Config.h
+++ b/Config.h
@@ -20,9 +20,8 @@
#define CONFIG_H
#define MAJ_VERS 0x01
- #define MIN_VERS 0x2E
- #define FW_RELEASE_TAG "1.0.46"
-
+ #define MIN_VERS 0x2F
+ #define FW_RELEASE_TAG "1.0.47"
#define MODE_HOST 0x11
#define MODE_TNC 0x12
diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino
index 2448521..89fb6a5 100755
--- a/RNode_Firmware.ino
+++ b/RNode_Firmware.ino
@@ -170,33 +170,28 @@ protected:
VERBOSEF("[LoRa] TX %u bytes", data.size());
TRACEF("LoRaInterface.send_outgoing: (%u bytes) data: %s", data.size(), data.toHex().c_str());
TRACE("LoRaInterface.send_outgoing: adding packet to outgoing queue...");
- for (size_t i = 0; i < data.size(); i++) {
- if (queue_height < CONFIG_QUEUE_MAX_LENGTH && queued_bytes < CONFIG_QUEUE_SIZE) {
- queued_bytes++;
- packet_queue[queue_cursor++] = data.data()[i];
- if (queue_cursor == CONFIG_QUEUE_SIZE) queue_cursor = 0;
- }
- }
- if (!fifo16_isfull(&packet_starts) && queued_bytes < CONFIG_QUEUE_SIZE) {
- uint16_t s = current_packet_start;
- int16_t e = queue_cursor-1; if (e == -1) e = CONFIG_QUEUE_SIZE-1;
- uint16_t l;
-
- if (s != e) {
- l = (s < e) ? e - s + 1 : CONFIG_QUEUE_SIZE - s + e + 1;
- } else {
- l = 1;
- }
- if (l >= MIN_L) {
- queue_height++;
-
- fifo16_push(&packet_starts, s);
- fifo16_push(&packet_lengths, l);
+ const size_t available_bytes = CONFIG_QUEUE_SIZE - queued_bytes;
+ if (fifo16_isfull(&packet_starts) || fifo16_isfull(&packet_lengths) ||
+ queue_height >= CONFIG_QUEUE_MAX_LENGTH || data.size() > available_bytes) {
+ WARNINGF("[LoRa] TX DROP %u bytes: queue packets=%u bytes=%u",
+ data.size(), queue_height, queued_bytes);
+ return;
+ }
- current_packet_start = queue_cursor;
- }
+ for (size_t i = 0; i < data.size(); i++) {
+ queued_bytes++;
+ packet_queue[queue_cursor++] = data.data()[i];
+ if (queue_cursor == CONFIG_QUEUE_SIZE) queue_cursor = 0;
+ }
+ uint16_t packet_start = current_packet_start;
+ uint16_t packet_length = data.size();
+ if (packet_length >= MIN_L) {
+ queue_height++;
+ fifo16_push(&packet_starts, packet_start);
+ fifo16_push(&packet_lengths, packet_length);
+ current_packet_start = queue_cursor;
}
// Perform post-send housekeeping
InterfaceImpl::handle_outgoing(data);
diff --git a/docs/firmware/versions.json b/docs/firmware/versions.json
index fb5839b..c5dcc13 100644
--- a/docs/firmware/versions.json
+++ b/docs/firmware/versions.json
@@ -1,4 +1,17 @@
[
+ {
+ "tag": "v1.0.47",
+ "name": "v1.0.47 — LoRa repeater audit: atomic queue, same-interface announce propagation",
+ "stability": "beta",
+ "prerelease": false,
+ "published_at": "2026-07-27T00:00:00Z",
+ "assets": [
+ "rtnode_heltec_v3.bin",
+ "rtnode_heltec_v3_merged.bin",
+ "rtnode_heltec_v4.bin",
+ "rtnode_heltec_v4_merged.bin"
+ ]
+ },
{
"tag": "v1.0.46",
"name": "v1.0.46 \u2014 Proof timeout fix: extra_link_proof_timeout for LoRa interfaces",
diff --git a/versions.json b/versions.json
index 20f9f10..219deef 100644
--- a/versions.json
+++ b/versions.json
@@ -1,4 +1,17 @@
[
+ {
+ "tag": "v1.0.47",
+ "name": "v1.0.47 — LoRa repeater audit: atomic queue, same-interface announce propagation",
+ "stability": "beta",
+ "prerelease": false,
+ "published_at": "2026-07-27T00:00:00Z",
+ "assets": [
+ "rtnode_heltec_v3.bin",
+ "rtnode_heltec_v3_merged.bin",
+ "rtnode_heltec_v4.bin",
+ "rtnode_heltec_v4_merged.bin"
+ ]
+ },
{
"tag": "v1.0.46",
"name": "v1.0.46 — Proof timeout fix: extra_link_proof_timeout for LoRa interfaces",
Served by rngit 1.4.2 - Generated in 0.03s